package com.dhcc.core.api.shiro;

import org.apache.shiro.mgt.DefaultSessionStorageEvaluator;
import org.apache.shiro.mgt.DefaultSubjectDAO;
import org.apache.shiro.session.mgt.DefaultSessionManager;
import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
import org.springframework.stereotype.Component;

/**
 * api的SecurityManager工场类
 * 
 * @ClassName: ApiSecurityManagerFactory
 * @Description: 禁用使用Sessions 作为存储策略的实现，但它没有完全地禁用Sessions所以需要配合context.
 *               setSessionCreationEnabled(false);
 * @author: cyf
 * @date: 2018年1月2日 上午10:08:06
 */
@Component("apiSecurityManagerFactory")
public class ApiSecurityManagerFactory {

    private DefaultWebSecurityManager apiSecurityManager = null;

    public DefaultWebSecurityManager getApiSecurityManager() {
        if (apiSecurityManager == null) {
            DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
            securityManager.setRealm(new ApiAuthorizingRealm());
            DefaultSessionManager sessionManager = new DefaultSessionManager();
            sessionManager.setSessionValidationSchedulerEnabled(false);
            securityManager.setSessionManager(sessionManager);
            securityManager.setSubjectFactory(new ApiSubjectFactory());
            /*
             * 禁用使用Sessions 作为存储策略的实现，但它没有完全地禁用Sessions
             * 所以需要配合context.setSessionCreationEnabled(false);
             */
            ((DefaultSessionStorageEvaluator) ((DefaultSubjectDAO) securityManager.getSubjectDAO())
                    .getSessionStorageEvaluator()).setSessionStorageEnabled(false);
            this.apiSecurityManager = securityManager;
        }

        return this.apiSecurityManager;
    }
}
